package io01;

import java.io.FileInputStream;
import java.io.IOException;

/** 文件输入流，读取文件数据 */
public class FISDemo {
    public static void main(String[] args) throws IOException {
        /*
        FileInputStream(String fileName)
        FileInputStream(File file)
        上述两种构造器创建文件输入流时，如果参数表达的是一个文件则可以正常实例化
        若表达的文件不存在，则发生异常
         */
        FileInputStream fis = new FileInputStream("fos.dat");//定义文件输入流
        /*
        InputStream超类上定义了读取了一个字节的方法(所有的字节输入流都具有该方法)
        int read()：读取1个字节，并以int形式返回
        1)返回的int值对应的2进制中只有"低八位"，高24位全部补0
        2)如果该方法返回的int值为-1(32个1)，则表示读取到了文件末尾
        */

        int d = fis.read(); //读取第1个字节
        System.out.println(d);//输出10进制的数据：3
        d = fis.read();//又读取了1个字节
        System.out.println(d);//输出10进制数据：5
        d = fis.read(); //读取文件末尾了
        System.out.println(d); //输出10进制数据：-1，表示到文件末尾了

        /*
        第1次调用：int d = fis.read();
        fos.dat的数据：
        00000011 00000101 文件末尾
        ^^^^^^^^
        读取的字节
        此时变量d对应的2进制的样子：00000000 00000000 00000000 00000011
                                            ---补充24个0---读取的字节---十进制的3

        第2次调用：d = fis.read(); //读取了第2个字节
        fos.dat的数据：
        00000011 00000101 文件末尾
                 ^^^^^^^^
                 读取的字节
        此时变量d对应的2进制的样子：00000000 00000000 00000000 00000101
                                            ---补充24个0---读取的字节---十进制的5

        第3次调用：d = fis.read(); //读取了文件末尾
        fos.dat的数据：
        00000011 00000101 文件末尾
                          ^^^^^^^^
                          没有字节了
        此时变量d对应的2进制的样子：11111111 11111111 11111111 11111111
                                      ---32个二进制的1---十进制的-1

        */

        /*
        int d = fis.read();
        System.out.println(d); //255

        调用：int d = fis.read();
        fos.dat的数据：
        11111111 文件末尾
        ^^^^^^^^
        读取的字节
        此时变量d对应的2进制的样子：00000000 00000000 00000000 11111111
                                            ---补充24个0---读取的字节---十进制的255
         */
        fis.close();//关闭流
    }
}
